package org.javahispano.javacup.tacticas_aceptadas.boguies;

import java.awt.Color;
import org.javahispano.javacup.modelo.*;

import java.util.LinkedList;
import java.util.List;

public class GerardoFC implements Tactica {

    Posicion alineacion1[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(10.6993006993007,-42.76018099547511),
            new Posicion(-9.510489510489512,-43.710407239819006),
            new Posicion(5.706293706293707,-38.72171945701358),
            new Posicion(-1.902097902097902,-38.95927601809955),
            new Posicion(14.503496503496503,-33.02036199095023),
            new Posicion(-0.951048951048951,-30.16968325791855),
            new Posicion(-15.454545454545453,-31.83257918552036),
            new Posicion(1.188811188811189,-2.1380090497737556),
            new Posicion(-5.706293706293707,-13.303167420814479),
            new Posicion(6.895104895104895,-12.828054298642533)
        };

        Posicion alineacion2[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(20.20979020979021,-35.39592760180996),
            new Posicion(-20.923076923076923,-35.8710407239819),
            new Posicion(10.461538461538462,-30.407239819004527),
            new Posicion(-8.55944055944056,-30.88235294117647),
            new Posicion(19.020979020979023,-21.380090497737555),
            new Posicion(-0.23776223776223776,-20.90497737556561),
            new Posicion(-17.832167832167833,-21.61764705882353),
            new Posicion(0.23776223776223776,7.601809954751132),
            new Posicion(-15.692307692307693,-1.4253393665158371),
            new Posicion(17.356643356643357,-1.6628959276018098)
        };

        Posicion alineacion3[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(24.727272727272727,-25.893665158371043),
            new Posicion(-24.727272727272727,-25.418552036199095),
            new Posicion(9.986013986013985,-25.893665158371043),
            new Posicion(-6.895104895104895,-25.893665158371043),
            new Posicion(19.020979020979023,-8.076923076923077),
            new Posicion(0.0,-8.314479638009049),
            new Posicion(-17.832167832167833,-8.076923076923077),
            new Posicion(-1.188811188811189,22.330316742081447),
            new Posicion(-19.25874125874126,12.59049773755656),
            new Posicion(19.25874125874126,14.015837104072398)
        };

        Posicion alineacion4[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(24.727272727272727,-12.59049773755656),
            new Posicion(-24.48951048951049,-12.59049773755656),
            new Posicion(10.6993006993007,-12.59049773755656),
            new Posicion(-6.181818181818182,-13.540723981900454),
            new Posicion(19.25874125874126,9.027149321266968),
            new Posicion(0.23776223776223776,9.502262443438914),
            new Posicion(-17.11888111888112,9.027149321266968),
            new Posicion(0.0,30.88235294117647),
            new Posicion(-13.314685314685315,29.694570135746606),
            new Posicion(14.503496503496503,29.21945701357466)
        };

        Posicion alineacion5[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(23.3006993006993,-32.07013574660634),
            new Posicion(-21.636363636363637,-31.357466063348415),
            new Posicion(10.6993006993007,-30.88235294117647),
            new Posicion(-5.468531468531468,-31.357466063348415),
            new Posicion(21.3986013986014,-18.529411764705884),
            new Posicion(1.188811188811189,-16.866515837104075),
            new Posicion(-16.405594405594407,-17.34162895927602),
            new Posicion(-0.7132867132867133,-0.7126696832579186),
            new Posicion(-9.272727272727272,-2.3755656108597285),
            new Posicion(9.510489510489512,-0.9502262443438915)
        };

        Posicion alineacion6[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(23.3006993006993,-32.07013574660634),
            new Posicion(-21.636363636363637,-31.357466063348415),
            new Posicion(10.6993006993007,-30.88235294117647),
            new Posicion(-5.468531468531468,-31.357466063348415),
            new Posicion(15.454545454545453,-18.29185520361991),
            new Posicion(1.188811188811189,-18.529411764705884),
            new Posicion(-12.839160839160838,-19.479638009049776),
            new Posicion(0.0,-10.214932126696834),
            new Posicion(-11.888111888111888,-7.364253393665159),
            new Posicion(10.223776223776223,-7.601809954751132)
        };

        Posicion alineacion7[]=new Posicion[]{
            new Posicion(0.2595419847328244,-50.41044776119403),
            new Posicion(23.3006993006993,-32.07013574660634),
            new Posicion(-21.636363636363637,-31.357466063348415),
            new Posicion(10.6993006993007,-30.88235294117647),
            new Posicion(-5.468531468531468,-31.357466063348415),
            new Posicion(15.454545454545453,-18.29185520361991),
            new Posicion(1.188811188811189,-18.529411764705884),
            new Posicion(-12.839160839160838,-19.479638009049776),
            new Posicion(0.0,-10.214932126696834),
            new Posicion(-11.888111888111888,-7.364253393665159),
            new Posicion(10.223776223776223,-7.601809954751132)
        };

        class TacticaDetalleImpl implements TacticaDetalle {

            public String getNombre() {
                return "gerardo";
            }

            public String getPais() {
                return "Andorra";
            }

            public String getEntrenador() {
                return "Gerardo";
            }

            public Color getColorCamiseta() {
                return new Color(255, 255, 255);
            }

            public Color getColorPantalon() {
                return new Color(0, 0, 153);
            }

            public Color getColorFranja() {
                return new Color(255, 0, 0);
            }

            public Color getColorCalcetas() {
                return new Color(0, 0, 153);
            }

            public Color getColorPortero() {
                return new Color(35, 36, 238        );
            }

            public EstiloUniforme getEstilo() {
                return EstiloUniforme.LINEAS_VERTICALES;
            }

            public Color getColorCamiseta2() {
                return new Color(75, 42, 172);
            }

            public Color getColorPantalon2() {
                return new Color(249, 25, 204);
            }

            public Color getColorFranja2() {
                return new Color(107, 207, 206);
            }

            public Color getColorCalcetas2() {
                return new Color(80, 94, 248);
            }

            public Color getColorPortero2() {
                return new Color(76, 192, 202        );
            }

            public EstiloUniforme getEstilo2() {
                return EstiloUniforme.FRANJA_HORIZONTAL;
            }

            class JugadorImpl implements JugadorDetalle {

                String nombre;
                int numero;
                Color piel, pelo;
                double velocidad, remate, presicion;
                boolean portero;
                Posicion posicion;

                public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                        double velocidad, double remate, double presicion, boolean portero) {
                    this.nombre=nombre;
                    this.numero=numero;
                    this.piel=piel;
                    this.pelo=pelo;
                    this.velocidad=velocidad;
                    this.remate=remate;
                    this.presicion=presicion;
                    this.portero=portero;
                }

                public String getNombre() {
                    return nombre;
                }

                public Color getColorPiel() {
                    return piel;
                }

                public Color getColorPelo() {
                    return pelo;
                }

                public int getNumero() {
                    return numero;
                }

                public boolean esPortero() {
                    return portero;
                }

                public double getVelocidad() {
                    return velocidad;
                }

                public double getRemate() {
                    return remate;
                }

                public double getPresicion() {
                    return presicion;
                }

            }

            public JugadorDetalle[] getJugadores() {
                return new JugadorDetalle[]{
                    new JugadorImpl("Jugador", 1, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, true),
                    new JugadorImpl("Jugador", 2, new Color(255,200,150), new Color(50,0,0),1.0d,0.47d,0.47d, false),
                    new JugadorImpl("Jugador", 3, new Color(255,200,150), new Color(50,0,0),1.0d,0.5d,0.5d, false),
                    new JugadorImpl("Jugador", 4, new Color(255,200,150), new Color(50,0,0),1.0d,0.65d,0.65d, false),
                    new JugadorImpl("Jugador", 5, new Color(255,200,150), new Color(50,0,0),1.0d,0.62d,0.62d, false),
                    new JugadorImpl("Jugador", 6, new Color(255,200,150), new Color(50,0,0),1.0d,0.67d,0.66d, false),
                    new JugadorImpl("Jugador", 7, new Color(255,200,150), new Color(50,0,0),1.0d,0.62d,0.63d, false),
                    new JugadorImpl("Jugador", 8, new Color(255,200,150), new Color(50,0,0),1.0d,0.72d,0.72d, false),
                    new JugadorImpl("Jugador", 9, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Jugador", 10, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                    new JugadorImpl("Jugador", 11, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false)
                };
            }
        }

        TacticaDetalle detalle=new TacticaDetalleImpl();
        public TacticaDetalle getDetalle() {
            return detalle;
        }

        public Posicion[] getPosicionSaca(SituacionPartido sp) {
        return alineacion5;
        }

        public Posicion[] getPosicionRecive(SituacionPartido sp) {
        return alineacion6;
        }
    
    LinkedList<Comando> comandos = new LinkedList<Comando>();
    Posicion balonant = new Posicion (0,0);
    boolean adelante = false;
    int topeLateral = 18; 
    
    public List<Comando> ejecutar(SituacionPartido sp) {
    	comandos.clear();
    	int rematan[] = sp.puedenRematar();
    	if (balonant.getY() < sp.balon().getY())
    		adelante = true;
    	else
    		adelante = false;
    	balonant = sp.balon();

    	moverDelanteros (sp);
    	moverCentrocampistas(sp);
    	moverDefensas (sp);
    	moverPortero (sp);

        //recorre los jugadores que pueden rematar y si puede tira hacia adelante
        for (int i : rematan) {
            if (dentroArea(sp.misJugadores()[i], sp))
            	tirarAPuerta(i, sp);
            else 
            	if (sp.saco())
            		comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1, 45));	
            	else
	            	if (esPortero(i))
	            		despejePortero(i, sp);
	            	else
	                	if (esDefensa(i))
	                		despejeDefensa(i, sp);
	                	else{
	                		if (esCentrocampista(i))
	                			remateCentrocampista(i, sp);
	                		else
	                			if (esDelantero(i))
	                				remateDelantero(i, sp);
                	}
        }
        return comandos;
    }
    private void tirarAPuerta(int i, SituacionPartido sp){
    	if (porteroEnfrente(i, sp)){
    		conduceBalon(i, sp, sp.misJugadores()[i].moverPosicion(5, 0));  //continua con el balon
    	}
    	else{
	    	//vemos donde esta situado el portero contrario
	    	int porteroRival = Constantes.centroArcoSup.indiceMasCercano(sp.rivales());
	    	Posicion alposte;
	    	if (sp.rivales()[porteroRival].getX() > -0.5 &&
	    		sp.rivales()[porteroRival].getX() < 0.5	)
	        	if (sp.misJugadores()[i].getX() > 0)
	        		alposte = new Posicion (2.5, Constantes.centroArcoSup.getY());
	        	else
	        		alposte = new Posicion (-2.5, Constantes.centroArcoSup.getY());
	    	else
	    		if (sp.rivales()[porteroRival].getX() < -0.5)
	    			alposte = new Posicion (2.5, Constantes.centroArcoSup.getY());
	    		else
	    			alposte = new Posicion (-2.5, Constantes.centroArcoSup.getY());
	        comandos.add(new ComandoGolpearBalon(i, alposte, 1, 20));
    	}
    }
    private void despejePortero (int i, SituacionPartido sp){
		if (verSiHayAlguienDelante(sp, sp.misJugadores()[i], sp.misJugadores()[i].moverPosicion(0, 20)))
			if (sp.balon().getX() < 0)
				comandos.add(new ComandoGolpearBalon(i, alineacion4[1], 1, 45));
			else
				comandos.add(new ComandoGolpearBalon(i, alineacion4[2], 1, 45));
		else
			comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1, 45));
		//else
		//	comandos.add(new ComandoGolpearBalon(i, p, 1, 45));
    }
    private void despejeDefensa (int i, SituacionPartido sp){
		if (verSiHayAlguienDelante(sp, sp.misJugadores()[i], sp.misJugadores()[i].moverPosicion(0, 20))){
			if (sp.misJugadores()[i].getX() > topeLateral)
				comandos.add(new ComandoGolpearBalon(i, Constantes.centroArcoSup, 1, 45));
			else
				conduceBalon(i, sp, sp.misJugadores()[i].moverPosicion(5, 0));
		}
		else{
    		Posicion p = pasarBalon(i,sp);
    		if (p.getX() == 0 && p.getY() == 0){
    			conduceBalon(i, sp, Constantes.centroArcoSup);
    		}
    		else
    			comandos.add(new ComandoGolpearBalon(i, p, 1, true));
		}
    }
    private void remateCentrocampista(int i, SituacionPartido sp){
    	if (verSiHayAlguienDelante(sp, sp.misJugadores()[i], sp.misJugadores()[i].moverPosicion(0, 10))){
    		if (sp.misJugadores()[i].getX() > topeLateral)
    			comandos.add(new ComandoGolpearBalon(i, alineacion4[8], 1, 45));
    		else
    			conduceBalon(i, sp, sp.misJugadores()[i].moverPosicion(5, 0));
    	}
    	else{
    		Posicion p2 = pasarBalon(i,sp);
    		if (p2.getX() == 0 && p2.getY() == 0){ 
    			if (cuadrante (sp.balon()).getY() > 2){
    				comandos.add(new ComandoGolpearBalon(i, alineacion4[9], 1, 45));
    			}
    			else
    				conduceBalon(i, sp, Constantes.centroArcoSup);
    		}
    		else{
    			comandos.add(new ComandoGolpearBalon(i, p2, fuerzaPase(i, p2, sp), false));
    		}
    	}
    }
    private void remateDelantero(int i, SituacionPartido sp){
		if (verSiHayAlguienDelante(sp, sp.misJugadores()[i], sp.misJugadores()[i].moverPosicion(0, 10))){
			if (sp.misJugadores()[i].getX() > topeLateral)
				comandos.add(new ComandoGolpearBalon(i, alineacion4[8], 1, 45));
			else
				conduceBalon(i, sp, sp.misJugadores()[i].moverPosicion(5, 0));
		}
		else{
    		Posicion p2 = pasarBalon(i,sp);
			if (p2.getX() == 0 && p2.getY() == 0){ 
				conduceBalon(i, sp, Constantes.centroArcoSup);
			}
			else{
				comandos.add(new ComandoGolpearBalon(i, p2, fuerzaPase(i, p2, sp), false));
			}
		}
    }
    private void moverDelanteros (SituacionPartido sp){
        //Movimiento de los 3 delanteros
    	if (cuadrante (sp.balon()).getY() > 3){
    		Posicion p1[] = new Posicion[]{
    				sp.misJugadores()[8], 
    				sp.misJugadores()[9], 
    				sp.misJugadores()[10]};
    		int mc = sp.balon().indiceMasCercano(p1);
    		mc = mc + 8;
    		//El delantero mas cercano va a buscar el balon
    		//Los demas, si vamos atacando van hacia porteria, si no hacia el centro
        	for (int i = 8; i < 11; i++){
        		if (i == mc && sp.puedenRematar().length == 0)
        			comandos.add(new ComandoIrA(mc, sp.balon()));
        		else
        			//if (sp.misJugadores()[i].distancia(sp.balon()) > 10)
        			//	comandos.add(new ComandoIrA(i, sp.balon()));
        			if (adelante)
        				if (sp.misJugadores()[i].getY() < sp.balon().getY())
        					comandos.add(new ComandoIrA(i, sp.misJugadores()[i].moverPosicion(0, 5)));
        				else
        					continue; //si esta por delante del balon se queda quieto
        			else
        				defecto (i, cuadrante (sp.balon()), sp);
        	}
    	}
    	else
        	for (int i = 8; i < 11; i++)
        		defecto (i, cuadrante (sp.balon()), sp);

    }
    private void moverCentrocampistas(SituacionPartido sp){
    	//Movimientos de los 3 centrocampistas
    	if (cuadrante (sp.balon()).getY() > 2 && cuadrante (sp.balon()).getY() < 5){
    		Posicion p1[] = new Posicion[]{
    				sp.misJugadores()[5], 
    				sp.misJugadores()[6], 
    				sp.misJugadores()[7]};
    		int mc = sp.balon().indiceMasCercano(p1);
    		mc = mc + 5;
    		//El centrocampista mas cercano va a buscar el balon
        	for (int i = 5; i < 8; i++){
        		if (i == mc && sp.puedenRematar().length == 0)
        			comandos.add(new ComandoIrA(i, sp.balon()));
        		else  //si atacamos, los demas van siempre por detras del balon o no se mueven
        			if (adelante)
        				if (sp.misJugadores()[i].getY() < sp.balon().getY())
        					comandos.add(new ComandoIrA(i, sp.misJugadores()[i].moverPosicion(0, 5)));
        				else
        					continue; //si esta por delante del balon se queda quieto
        			else //si defendemos y el balon esta en el otro campo, defecto
        				if (cuadrante (sp.balon()).getY()> 3)
        					defecto (i, cuadrante (sp.balon()), sp);
        				else //si el balon esta en nuestro campo
        					//if (sp.misJugadores()[i].distancia(sp.balon()) > 20)
        					if (cuadrante(sp.misJugadores()[i]).getY() > 2) //aqui retrocedemos con el balon
        						comandos.add(new ComandoIrA(i, sp.misJugadores()[i].moverPosicion(0, -5)));
        					//else  //aqui va a donde este el balon
        						//comandos.add(new ComandoIrA(i, sp.balon()));
        	}
    	}
    	else
        	for (int i = 5; i < 8; i++)
        		defecto (i, cuadrante (sp.balon()), sp);
    }
    private void moverDefensas (SituacionPartido sp){
    	//Movimientos de los 4 defensas
    	int[] k = rivalesCerca(Constantes.centroArcoInf, sp);
    	for (int i=1; i<5; i++)  //defensas 2, 3, 4 y 5
    		//if ((!adelante || masCercanos(sp.balon(), sp)[0] > 10 ) && cuadrante(sp.rivales()[k[i-1]]).getY() < 3){ // && cbalon.getY() < 4)
    		{
    			Posicion p = sp.rivales()[k[i-1]];
    			if (adelante)
    				comandos.add(new ComandoIrA(i, p.moverPosicion(0, 3)));
    			else
    				comandos.add(new ComandoIrA(i, p.moverPosicion(0, -3)));
    		}
    		//else
    			//defecto (i, cbalon, sp);
    	
    	if (cuadrante (sp.balon()).getY() < 4){
    		Posicion p1[] = new Posicion[]{
    				sp.misJugadores()[1], 
    				sp.misJugadores()[2], 
    				sp.misJugadores()[3], 
    				sp.misJugadores()[4]};
    		int mc = sp.balon().indiceMasCercano(p1);
    		mc = mc + 1;
    		//El mas cercano va a buscar el balon
        	for (int i = 1; i < 5; i++)
        		if (i == mc && sp.puedenRematar().length == 0)
        			comandos.add(new ComandoIrA(mc, sp.balon()));
    	}
    }
    private void moverPortero(SituacionPartido sp){
    	//Mover el portero
    	if (salirPortero(sp)) //Mira si tiene que salir el portero
    		comandos.add(new ComandoIrA(0, sp.balon()));
    	else
    		//Si esta fuera de su sitio, se coloca
    		if (sp.misJugadores()[0].getY() != alineacion1[0].getY())
    			comandos.add(new ComandoIrA (0, alineacion1[0]));
    		else
    			if (sp.balon().getX() < Constantes.posteIzqArcoInf.getX())
    				comandos.add(new ComandoIrA (0, new Posicion(Constantes.posteIzqArcoInf.getX(),alineacion1[0].getY())));
    			else
        			if (sp.balon().getX() > Constantes.posteDerArcoInf.getX())
        				comandos.add(new ComandoIrA (0, new Posicion(Constantes.posteDerArcoInf.getX(),alineacion1[0].getY())));
        			else
        				comandos.add(new ComandoIrA (0, new Posicion (sp.balon().getX(), alineacion1[0].getY())));
    }
    //Ver si tiene que salir el portero a por el balon
    private boolean salirPortero (SituacionPartido sp){
    	//Distancia del portero al balon mayor que el ancho del area: no sale a por el balon
    	if (sp.misJugadores()[0].distancia(sp.balon()) > Constantes.ANCHO_AREA_GRANDE)
    		return false;
    	//Distancia del portero a la porteria mayor que ancho area: no sale fuera del area
    	if (sp.misJugadores()[0].distancia(Constantes.centroArcoInf) > Constantes.ANCHO_AREA_GRANDE)
    		return false;
    	//Mas cercano al balon es el portero y un contrario, sale
    	if (masCercanos(sp.balon(), sp)[0] == 0)
    		if (masCercanos(sp.balon(), sp)[1] > 10)
    			return true;
    	//Mas cercano al balon es un contrario, sale
		if (masCercanos(sp.balon(), sp)[0] > 10)
			return true;
		//Distancia del portero al balon menor que ancho area peque�a: sale
    	if (sp.misJugadores()[0].distancia(sp.balon()) < Constantes.ANCHO_AREA_CHICA)
    		return true;
    	
    	return false;
    }
    //ver en que cuadrante esta situado un punto
    //dividimos el campo en 18 cuadrantes (3x3 para cada equipo)
    //Posiciones en el campo:
    //0,0 es el centro del campo
    //x=parte izquierda del campo es negativo, parte derecha positivo
    //y=campo propio es negativo, campo contrario es positivo
    //Posiciones de los cuadrantes
    //1,1 es la esquina inferior izquierda, 3,6 la superior derecha
    private Posicion cuadrante(Posicion x){
    	double anchoCuadrante = Constantes.ANCHO_CAMPO_JUEGO / 3;
    	double altoCuadrante = Constantes.LARGO_CAMPO_JUEGO / 6;
    	double posx = x.getX() + Constantes.ANCHO_CAMPO_JUEGO / 2;
    	double posy = x.getY() + Constantes.LARGO_CAMPO_JUEGO / 2;
    	int ancho = new Double(posx / anchoCuadrante).intValue();
    	int alto = new Double(posy / altoCuadrante).intValue();
    	ancho = ancho + 1;
    	alto = alto + 1;
    	return new Posicion(ancho, alto);
    }
    //Movimiento por defecto de los jugadores
    private void defecto (int i, Posicion x, SituacionPartido sp){
    	int linea = new Double(x.getY()).intValue();
    	if (esDefensa(i)){   //defensas 2, 3, 4, 5
    		switch (linea){
    		case 1:
    			comandos.add(new ComandoIrA(i, alineacion1[i])); break;
    		case 2:
    			comandos.add(new ComandoIrA(i, alineacion2[i])); break;
    		case 3:
    		case 4:
    			//comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 5:
    		case 6:
    			comandos.add(new ComandoIrA(i, alineacion4[i])); break;
    		}
    	}
    	if (esCentrocampista(i)){   //centrocampistas 6, 7, 8
    		switch (linea){
    		case 1:
    			comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 2:
    			comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 3:
    			comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 4:
    			comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 5:
    		case 6:
    			comandos.add(new ComandoIrA(i, alineacion4[i])); break;
    		}
    	}
    	if (esDelantero(i)){ //delanteros 9, 10, 11
    		switch (linea){
    		case 1:
    		case 2:
    		case 3:
    		case 4:
    			comandos.add(new ComandoIrA(i, alineacion3[i])); break;
    		case 5:
    		case 6:
    			comandos.add(new ComandoIrA(i, alineacion4[i])); break;
    		}
    	}
    }
    private Posicion pasarBalon (int jugador, SituacionPartido sp){
    	//si no hay ningun contrario cerca sigue adelante, devuelve 0,0
    	if (jugador > 4 && !verSiHayAlguienDelante(sp, sp.balon(), sp.balon().moverPosicion(0, 10)))
    	//if (jugador > 5 && desmarcado(jugador, sp)){  //centrocampistas y delanteros
        	return new Posicion (0,0);    
    	//}
    	//si hay algun contrario cerca busca un pase
    	double dondestoy = sp.misJugadores()[jugador].getY();
    	double d2 = 0 , d3 = -999;
    	int pase = 0;
    	for (int i = 1; i < 11; i++){  //recorre todos mis jugadores menos el portero
    		if (i == jugador)
    			continue;
    		//si esta por detras en el campo no nos vale
    		d2 = sp.misJugadores()[i].getY();
    		if (d2 < dondestoy)
    			continue;
    		//si no esta desmarcado no nos vale
    		if (!desmarcado(i, sp, 5))
    			continue;
    		//si esta a mucha distancia no nos vale
    		d2 = sp.misJugadores()[jugador].distancia(sp.misJugadores()[i]);
    		if (d2 > 30)  //distancia del compa�ero
    			continue;
    		if (d2 < d3)  //hay otro jugador mas lejos
    			continue;
    		//Si de donde estoy a donde voy a centrar hay alg�n contrario, no nos vale
    		if (verSiHayAlguienDelante(sp, sp.misJugadores()[jugador], sp.misJugadores()[i]))
    			continue;
    		d3 = d2;
    		pase = i;
    	}
    	if (pase == 0)
    		return new Posicion (0,0);
    	else
    		return sp.misJugadores()[pase];
    }

    //Obtiene una lista de jugadores, de los dos equipos, mas cercanos a una posicion
    //equipo local del 0 al 10, equipo visitante del 11 al 21
    private int[] masCercanos (Posicion p, SituacionPartido sp){
    	Posicion[] pos1 = sp.misJugadores();
    	Posicion[] pos2 = sp.rivales();
    	Posicion[] pos = new Posicion[22];
    	int [] j;
    	System.arraycopy(pos1, 0, pos, 0, 11);
    	System.arraycopy(pos2, 0, pos, 11, 11);
    	j = p.indicesMasCercanos(pos);
    	return j;
    }
    private int[] rivalesCerca (Posicion pos, SituacionPartido sp){
    	Posicion[] p = sp.rivales();
    	return pos.indicesMasCercanos(p);
    }
    //Devuelve true si hay algun jugador rival entre p1 y p2
    private boolean verSiHayAlguienDelante(SituacionPartido sp, Posicion p1, Posicion p2){
    	double margen = 0.8;
    	if (p2.getY() < p1.getY()){
    		//System.out.println("verSiHayAlguienDelante: p2 menor que p1");
    		return false;
    	}
    	double distancia = p1.distancia(p2);
    	if (distancia > 15 && distancia < 25)
    		margen = 0.6;
    	if (distancia > 8 && distancia < 15)
    		margen = 0.4;
    	if (distancia > 0 && distancia < 8)
    		margen = 0.2;
		double k1 = p1.angulo(p2);
		for (int n = 1; n < 11; n++){    //el portero no cuenta
			if (p1.distancia(sp.rivales()[n]) > distancia+5)
				continue;
			if (p1.getY() > sp.rivales()[n].getY())
				continue;
			double b = p1.angulo(sp.rivales()[n]);
			double dif = k1 - b;
			if (dif > -margen && dif < margen)
				return true;
		}
		return false;
    }
    //Ver si un jugador esta desmarcado
    private boolean desmarcado (int jugador, SituacionPartido sp, int cuanto){
    	Posicion yo = sp.misJugadores()[jugador];
    	Posicion el = sp.rivales()[yo.indiceMasCercano(sp.rivales())];
    	if (yo.distancia(el) > cuanto)
    		return true;
    	else
    		return false;
    }
    //Ver si se puede hacer jugada en el area
    private boolean porteroEnfrente(int jugador, SituacionPartido sp){
    	if (sp.misJugadores()[jugador].getX() < -1.2 || sp.misJugadores()[jugador].getX() > 1.2)
    		return false;
    	return true;
    }
    //Devuelve la fuerza del pase en funcion de la distancia entre un jugador y una posicion
    private double fuerzaPase(int x, Posicion y, SituacionPartido sp){
    	double dist = sp.misJugadores()[x].distancia(y);
    	if (dist < 5)
    		return 0.5;
    	if (dist < 10)
    		return 0.6;
    	if (dist < 15)
    		return 0.7;
		if (dist < 20)
			return 0.8;
		if (dist < 25)
			return 0.9;
    	return 1;
    }
    private boolean esPortero(int i){
    	if (i==0)
    		return true;
    	else
    		return false;
    }
    private boolean esDefensa(int i){
    	if (i>0 && i <5)
    		return true;
    	else
    		return false;
    }
    private boolean esCentrocampista (int i){
    	if (i>4 && i<8)
    		return true;
    	else
    		return false;
    }
    private boolean esDelantero(int i){
    	if (i>7 && i<11)
    		return true;
    	else
    		return false;
    }
    private boolean dentroArea(Posicion p, SituacionPartido sp){
    	if (p.distancia(Constantes.centroArcoSup) < Constantes.ANCHO_AREA_GRANDE+15)
    		return true;
    	int porteroRival = Constantes.centroArcoSup.indiceMasCercano(sp.rivales());
    	if (p.distancia(sp.rivales()[porteroRival]) < Constantes.ANCHO_AREA_GRANDE)
    		return true;
   		return false;
    }
    private void conduceBalon(int i, SituacionPartido sp, Posicion donde){
		//comandos.add(new ComandoGolpearBalon(i));  //continua con el balon
		comandos.add(new ComandoIrA(i, donde));
		double velRemate = Constantes.getVelocidadRemate(sp.detalleMisJugadores()[i].getRemate());
		double velocidad = 1d / velRemate;
		velocidad = velocidad * 1.4;
		comandos.add(new ComandoGolpearBalon(i, donde, velocidad, false));
    }
}